package modulos.reservacion.vista;

import modulos.usuario.modelo.Usuario;
import modulos.reservacion.modelo.Reservacion;
import modulos.paciente.modelo.Paciente;
import basedatos.OperacionesBD;
import basedatos.ReservacionBD;
import java.awt.event.KeyEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import modulos.paciente.vista.iFrmLstPaciente;
import modulos.reservacion.modelo.Hora;
import modulos.reservacion.modelo.Reservacion_Config;
import modulos.reservacion.modelo.Servicio;
import vista.frmPrincipal;
import vista.modelo.OperacionesVarias;

/**
 *
 * @author Edulima
 */
public class iFrmReservaCita extends javax.swing.JInternalFrame {

    private static Paciente paciente = null;
    private Usuario usuario = new Usuario();
    private Reservacion reservacion = new Reservacion();
    private Reservacion_Config reservacion_Config = new Reservacion_Config();
    private ArrayList<Object> listaMedicos = new ArrayList<Object>();
    private ArrayList<Reservacion> listaReservaciones = new ArrayList<Reservacion>();
    private ArrayList<Hora> horasDisponibles = new ArrayList<Hora>();
    private ArrayList<Object> listaServicios = new ArrayList<Object>();
    private Servicio servicio = null;
    private DateFormat dateFormatDB = new SimpleDateFormat("yyyy-MM-dd");
    private java.util.Date hoy = new java.util.Date();
    private DefaultTableModel modeloTablaReservaciones = new DefaultTableModel();
    public static final String ESTADO_RESERVADO = "RESERVADO";
    public static final String ESTADO_ATENDIDO = "ATENDIDO";
    public static final String ESTADO_NO_ATENDIDO = "NO ATENDIDO";
    public static final String ESTADO_CANCELADA = "CANCELADA";
    ////////////////

    public iFrmReservaCita() {
        modeloTablaReservaciones.addColumn("Nro.");
        modeloTablaReservaciones.addColumn("Medico");
        modeloTablaReservaciones.addColumn("N° HC");
        modeloTablaReservaciones.addColumn("Paciente");
        modeloTablaReservaciones.addColumn("fecha");
        modeloTablaReservaciones.addColumn("hora");
        modeloTablaReservaciones.addColumn("estado");
        initComponents();
        OperacionesVarias.cerrarVentanaEscape(this);
        tblReservaciones.getColumnModel().getColumn(0).setPreferredWidth(40);
        tblReservaciones.getColumnModel().getColumn(1).setPreferredWidth(290);
        tblReservaciones.getColumnModel().getColumn(2).setPreferredWidth(60);
        tblReservaciones.getColumnModel().getColumn(3).setPreferredWidth(180);
        tblReservaciones.getColumnModel().getColumn(4).setPreferredWidth(75);
        tblReservaciones.getColumnModel().getColumn(5).setPreferredWidth(45);
        tblReservaciones.getColumnModel().getColumn(6).setPreferredWidth(90);
        tblReservaciones.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        cmbFecha.setDate(new Date());
        listarMedicos();
        this.setVisible(true);
    }

    public iFrmReservaCita(Paciente paciente) {
        modeloTablaReservaciones.addColumn("Nro.");
        modeloTablaReservaciones.addColumn("Medico");
        modeloTablaReservaciones.addColumn("N° HC");
        modeloTablaReservaciones.addColumn("Paciente");
        modeloTablaReservaciones.addColumn("fecha");
        modeloTablaReservaciones.addColumn("hora");
        modeloTablaReservaciones.addColumn("estado");
        initComponents();
        OperacionesVarias.cerrarVentanaEscape(this);
        tblReservaciones.getColumnModel().getColumn(0).setPreferredWidth(40);
        tblReservaciones.getColumnModel().getColumn(1).setPreferredWidth(290);
        tblReservaciones.getColumnModel().getColumn(2).setPreferredWidth(60);
        tblReservaciones.getColumnModel().getColumn(3).setPreferredWidth(180);
        tblReservaciones.getColumnModel().getColumn(4).setPreferredWidth(75);
        tblReservaciones.getColumnModel().getColumn(5).setPreferredWidth(45);
        tblReservaciones.getColumnModel().getColumn(6).setPreferredWidth(90);
        tblReservaciones.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        cmbFecha.setDate(new Date());
        listarMedicos();
        btnBuscarPaciente.setVisible(false);
        pnlCambioEspecialista.removeAll();
        iFrmReservaCita.paciente = paciente;
        setPaciente(paciente);
        usuario = (Usuario) frmPrincipal.UsuarioLogueado.get(0)[1];
        txtMedico.setText(usuario + "");
        pnlCambioEspecialista.add(txtMedico);
        this.setVisible(true);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        grpradBuscar = new javax.swing.ButtonGroup();
        txtMedico = new javax.swing.JTextField();
        btnCerrar = new javax.swing.JButton();
        pnlIdentidad = new javax.swing.JPanel();
        lblCedula = new javax.swing.JLabel();
        lblApellido = new javax.swing.JLabel();
        lblNombre = new javax.swing.JLabel();
        lblnhc = new javax.swing.JLabel();
        txtNhc = new javax.swing.JTextField();
        txtCedula = new javax.swing.JTextField();
        txtNombre = new javax.swing.JTextField();
        txtApellido = new javax.swing.JTextField();
        pnlEspecialista = new javax.swing.JPanel();
        lblMedico = new javax.swing.JLabel();
        pnlCambioEspecialista = new javax.swing.JPanel();
        cmbMedico = new javax.swing.JComboBox();
        scrolpReserva = new javax.swing.JScrollPane();
        tblReservaciones = new JTable() {
            public boolean isCellEditable(int rowIndex, int vColIndex) {
                return false;
            }
        };
        pnlFechaHora = new javax.swing.JPanel();
        lblFechaReserva = new javax.swing.JLabel();
        lblHora = new javax.swing.JLabel();
        lblTiempo = new javax.swing.JLabel();
        lblServicio = new javax.swing.JLabel();
        lblValor = new javax.swing.JLabel();
        txtTiempo = new javax.swing.JTextField();
        txtCosto = new javax.swing.JTextField();
        cmbHorario = new javax.swing.JComboBox();
        btnReservar = new javax.swing.JButton();
        cmbServicio = new javax.swing.JComboBox();
        cmbFecha = new com.toedter.calendar.JDateChooser();
        btnCancelarRes = new javax.swing.JButton();
        lblReservacion = new javax.swing.JLabel();
        btnBuscarPaciente = new javax.swing.JButton();

        txtMedico.setEditable(false);

        setClosable(true);
        setTitle("Reservaciones:");
        setFocusCycleRoot(false);
        setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/jpgs/Task.png"))); // NOI18N
        setPreferredSize(new java.awt.Dimension(660, 610));
        setVerifyInputWhenFocusTarget(false);
        setVisible(true);

        btnCerrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpgs/agt_home.png"))); // NOI18N
        btnCerrar.setText("Cerrar");
        btnCerrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCerrarActionPerformed(evt);
            }
        });

        pnlIdentidad.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Paciente:", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.TOP, null, new java.awt.Color(80, 73, 73)));
        pnlIdentidad.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        lblCedula.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblCedula.setForeground(new java.awt.Color(92, 7, 7));
        lblCedula.setText("Cédula:");
        pnlIdentidad.add(lblCedula, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 20, 60, -1));

        lblApellido.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblApellido.setForeground(new java.awt.Color(92, 7, 7));
        lblApellido.setText("Apellidos:");
        pnlIdentidad.add(lblApellido, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 20, 80, -1));

        lblNombre.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblNombre.setForeground(new java.awt.Color(92, 7, 7));
        lblNombre.setText("Nombres:");
        pnlIdentidad.add(lblNombre, new org.netbeans.lib.awtextra.AbsoluteConstraints(410, 20, 80, -1));

        lblnhc.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblnhc.setForeground(new java.awt.Color(92, 7, 7));
        lblnhc.setText("NHC:");
        pnlIdentidad.add(lblnhc, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 20, -1, -1));

        txtNhc.setBackground(new java.awt.Color(225, 228, 248));
        txtNhc.setEditable(false);
        txtNhc.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        pnlIdentidad.add(txtNhc, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 40, 80, -1));

        txtCedula.setBackground(new java.awt.Color(225, 228, 248));
        txtCedula.setEditable(false);
        txtCedula.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        pnlIdentidad.add(txtCedula, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 40, 130, -1));

        txtNombre.setBackground(new java.awt.Color(225, 228, 248));
        txtNombre.setEditable(false);
        pnlIdentidad.add(txtNombre, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 40, 180, -1));

        txtApellido.setBackground(new java.awt.Color(225, 228, 248));
        txtApellido.setEditable(false);
        pnlIdentidad.add(txtApellido, new org.netbeans.lib.awtextra.AbsoluteConstraints(220, 40, 180, -1));

        pnlEspecialista.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Especialista:", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.TOP, null, new java.awt.Color(80, 73, 73)));

        lblMedico.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblMedico.setForeground(new java.awt.Color(92, 7, 7));
        lblMedico.setText("Médico     /     Especialidad:");

        pnlCambioEspecialista.setLayout(new java.awt.BorderLayout());

        cmbMedico.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbMedicoActionPerformed(evt);
            }
        });
        pnlCambioEspecialista.add(cmbMedico, java.awt.BorderLayout.CENTER);

        javax.swing.GroupLayout pnlEspecialistaLayout = new javax.swing.GroupLayout(pnlEspecialista);
        pnlEspecialista.setLayout(pnlEspecialistaLayout);
        pnlEspecialistaLayout.setHorizontalGroup(
            pnlEspecialistaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlEspecialistaLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(pnlEspecialistaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(pnlCambioEspecialista, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblMedico))
                .addGap(58, 58, 58))
        );
        pnlEspecialistaLayout.setVerticalGroup(
            pnlEspecialistaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlEspecialistaLayout.createSequentialGroup()
                .addComponent(lblMedico)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(pnlCambioEspecialista, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        tblReservaciones.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        tblReservaciones.setModel(modeloTablaReservaciones);
        tblReservaciones.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tblReservacionesKeyReleased(evt);
            }
        });
        scrolpReserva.setViewportView(tblReservaciones);

        pnlFechaHora.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Fecha de reservación:", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.TOP, null, new java.awt.Color(80, 73, 73)));

        lblFechaReserva.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblFechaReserva.setForeground(new java.awt.Color(92, 7, 7));
        lblFechaReserva.setText("Fecha:");

        lblHora.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblHora.setForeground(new java.awt.Color(92, 7, 7));
        lblHora.setText("Hora:");

        lblTiempo.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblTiempo.setForeground(new java.awt.Color(92, 7, 7));
        lblTiempo.setText("Tiempo:");

        lblServicio.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblServicio.setForeground(new java.awt.Color(92, 7, 7));
        lblServicio.setText("Servicio:");

        lblValor.setFont(new java.awt.Font("Ubuntu", 0, 13)); // NOI18N
        lblValor.setForeground(new java.awt.Color(92, 7, 7));
        lblValor.setText("Costo:");

        txtTiempo.setEditable(false);

        txtCosto.setEditable(false);

        cmbHorario.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                cmbHorarioFocusGained(evt);
            }
        });

        btnReservar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpgs/5days1.png"))); // NOI18N
        btnReservar.setText("Reservar");
        btnReservar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnReservarActionPerformed(evt);
            }
        });

        cmbServicio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbServicioActionPerformed(evt);
            }
        });

        cmbFecha.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                cmbFechaPropertyChange(evt);
            }
        });

        javax.swing.GroupLayout pnlFechaHoraLayout = new javax.swing.GroupLayout(pnlFechaHora);
        pnlFechaHora.setLayout(pnlFechaHoraLayout);
        pnlFechaHoraLayout.setHorizontalGroup(
            pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlFechaHoraLayout.createSequentialGroup()
                .addGap(14, 14, 14)
                .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblFechaReserva)
                    .addComponent(lblServicio))
                .addGap(18, 18, 18)
                .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(cmbFecha, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE)
                    .addComponent(cmbServicio, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlFechaHoraLayout.createSequentialGroup()
                        .addGap(22, 22, 22)
                        .addComponent(lblValor)
                        .addGap(18, 18, 18)
                        .addComponent(txtCosto, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(pnlFechaHoraLayout.createSequentialGroup()
                        .addGap(23, 23, 23)
                        .addComponent(lblHora)
                        .addGap(23, 23, 23)
                        .addComponent(cmbHorario, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pnlFechaHoraLayout.createSequentialGroup()
                        .addGap(26, 26, 26)
                        .addComponent(lblTiempo)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtTiempo, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 21, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlFechaHoraLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnReservar, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        pnlFechaHoraLayout.setVerticalGroup(
            pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlFechaHoraLayout.createSequentialGroup()
                .addGap(9, 9, 9)
                .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblFechaReserva, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cmbFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(cmbHorario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblHora, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblTiempo, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(txtTiempo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(19, 19, 19)
                .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pnlFechaHoraLayout.createSequentialGroup()
                        .addGap(3, 3, 3)
                        .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblServicio)
                            .addComponent(cmbServicio, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(pnlFechaHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtCosto, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblValor, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnReservar, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(14, Short.MAX_VALUE))
        );

        btnCancelarRes.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpgs/delete.png"))); // NOI18N
        btnCancelarRes.setText("Cancelar turno");
        btnCancelarRes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarResActionPerformed(evt);
            }
        });

        lblReservacion.setFont(new java.awt.Font("Ubuntu", 1, 13)); // NOI18N
        lblReservacion.setForeground(new java.awt.Color(80, 73, 73));
        lblReservacion.setText("Reservaciones:");

        btnBuscarPaciente.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpgs/search.png"))); // NOI18N
        btnBuscarPaciente.setText("Buscar Paciente");
        btnBuscarPaciente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBuscarPacienteActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnBuscarPaciente)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(lblReservacion)
                        .addComponent(scrolpReserva)
                        .addComponent(pnlIdentidad, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(pnlFechaHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(btnCancelarRes, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(360, 360, 360)
                            .addComponent(btnCerrar, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(pnlEspecialista, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addComponent(btnBuscarPaciente, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pnlIdentidad, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(4, 4, 4)
                .addComponent(pnlEspecialista, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pnlFechaHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lblReservacion)
                .addGap(4, 4, 4)
                .addComponent(scrolpReserva, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelarRes)
                    .addComponent(btnCerrar))
                .addContainerGap())
        );

        getAccessibleContext().setAccessibleParent(this);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void listarMedicos() {
        ArrayList<Object> aux = (ArrayList<Object>) OperacionesBD.listar("Usuario");
        for (Object obj : aux) {
            if (((Usuario) obj).getCuentaUsr().getTipo().equalsIgnoreCase("MEDICO")) {
                listaMedicos.add(obj);
            }
        }
        for (Object medico : listaMedicos) {
            cmbMedico.addItem(((Usuario) medico));
        }
    }

    private void cambiarMedico() {
        reservacion_Config = (Reservacion_Config) OperacionesBD.buscar("Reservacion_Config", "usuario_idPersona", usuario.getIdPersona() + "");
        listarHorario();
        listarServicios();
        txtTiempo.setText(reservacion_Config.getDuracion() + "");
        listarReservaciones();
    }

    private void listarServicios() {
        listaServicios = (ArrayList<Object>) OperacionesBD.listarPorUsuario("Servicio", usuario);
        cmbServicio.removeAllItems();
        for (Object obj : listaServicios) {
            cmbServicio.addItem(((Servicio) obj));
        }
    }

    private void actualizarHorarioDisponible() {
        horasDisponibles = new ArrayList<Hora>();
        Date f = cmbFecha.getDate();
        if (f == null) {
            f = new Date();
        }
        ArrayList<Object> reser = (ArrayList<Object>) ReservacionBD.listarPorFecha(usuario, dateFormatDB.format(f), ESTADO_RESERVADO);
        Reservacion re = (Reservacion) ReservacionBD.buscarPorFecha(paciente, dateFormatDB.format(f), ESTADO_RESERVADO);
        int horario = reservacion_Config.getHorarioAmDesde();
        do {
            horasDisponibles.add(new Hora(horario));
            horario += reservacion_Config.getDuracion();
        } while (horario <= reservacion_Config.getHorarioAmHasta());
        horario = reservacion_Config.getHorarioPmdesde();
        do {
            horasDisponibles.add(new Hora(horario));
            horario += reservacion_Config.getDuracion();
        } while (horario <= reservacion_Config.getHorarioPmHasta());

        for (Object res : reser) {
            for (Hora h : horasDisponibles) {
                if (h.getTiempo() == (((Reservacion) res).getHora())) {
                    horasDisponibles.remove(h);
                    break;
                }
            }
        }

        if (re != null) {
            for (Hora h : horasDisponibles) {
                if (h.getTiempo() == (re.getHora())) {
                    horasDisponibles.remove(h);
                    break;
                }
            }
        }

    }

    private void listarHorario() {
        actualizarHorarioDisponible();
        cmbHorario.removeAllItems();
        for (Hora h : horasDisponibles) {
            cmbHorario.addItem(h);
        }
    }

    private void listarReservaciones()//muestra las reservaciones del medico seleccionado
    {
        int c = modeloTablaReservaciones.getRowCount();
        for (int i = 0; i < c; i++) {
            modeloTablaReservaciones.removeRow(0);
        }
        Date d = cmbFecha.getDate();
        if (d != null) {
            listaReservaciones = (ArrayList<Reservacion>) ReservacionBD.listarPorFecha(usuario, dateFormatDB.format(d), ESTADO_RESERVADO);
        } else {
            listaReservaciones = (ArrayList<Reservacion>) ReservacionBD.listarPorFecha(usuario, dateFormatDB.format(new Date()), ESTADO_RESERVADO);
        }
        int cont = 0;
        DateFormat formato = new SimpleDateFormat("dd/MM/yyyy");

        for (Reservacion r : listaReservaciones) {
            cont++;
            Object[] fila = {
                cont,
                r.getUsuario(),
                r.getPaciente().getNumeroHC(),
                r.getPaciente(),
                formato.format(r.getFecha()),
                new Hora(r.getHora()),
                r.getEstado()
            };
            modeloTablaReservaciones.addRow(fila);
        }
    }

    private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCerrarActionPerformed
        this.dispose();
    }//GEN-LAST:event_btnCerrarActionPerformed

    public static void setPaciente(Paciente paciente) {
        iFrmReservaCita.paciente = paciente;
        txtCedula.setText(paciente.getCedula());
        txtNombre.setText(paciente + "");
        txtApellido.setText(paciente.getApellido());
        txtNhc.setText(paciente.getNumeroHC());
    }

    private boolean getReservacion() {
        int index = cmbHorario.getSelectedIndex();
        if (index != -1) {

            if (servicio != null) {
                reservacion = new Reservacion();
                reservacion.setEstado(ESTADO_RESERVADO);
                reservacion.setFecha(cmbFecha.getDate());
                reservacion.setPaciente(paciente);
                reservacion.setUsuario(usuario);
                reservacion.setHora(horasDisponibles.get(index).getTiempo());
                reservacion.setServicio(servicio);
                return true;
            } else {
                JOptionPane.showMessageDialog(this, "Imposible realizar la reservacion\nNo existen servicios disponibles", "INFORMACION", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }

        } else {
            JOptionPane.showMessageDialog(this, "Imposible realizar la reservacion\nNo existen turnos disponibles", "INFORMACION", JOptionPane.INFORMATION_MESSAGE);
            return false;
        }
    }

    private void btnReservarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnReservarActionPerformed
        if (paciente != null) {
            Date d = cmbFecha.getDate();
            if (d != null) {
                if (d.after(hoy)) {
                    if (!ReservacionBD.existe(paciente, usuario)) {
                        if (!ReservacionBD.existe(paciente, horasDisponibles.get(cmbHorario.getSelectedIndex()).getTiempo())) {
                            if (getReservacion()) {
                                OperacionesBD.guardar(reservacion);
                                listarReservaciones();
                                JOptionPane.showMessageDialog(null, "La reservación de cita médica se ha realizado correctamente ...", "Reservación de cita médica", JOptionPane.INFORMATION_MESSAGE);
                                listarHorario();
                            }
                        } else {
                            JOptionPane.showMessageDialog(null, "El paciente ya tiene reservada una cita medica para esta hora con otro especialista ...", "Reservación de cita médica", JOptionPane.WARNING_MESSAGE);
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "El paciente ya tiene reservada una cita medica con el mismo especialista ...", "Reservación de cita médica", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "No es posible reservar citas en fechas pasadas...", "Reservación de cita médica", JOptionPane.WARNING_MESSAGE);
                }
            } else {
                JOptionPane.showMessageDialog(null, "Seleccione una fecha valida", "Reservación de cita médica", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Para reservar una cita médica primero debe registrar y/o buscar un paciente", "Reservación de cita médica", JOptionPane.WARNING_MESSAGE);
        }

    }//GEN-LAST:event_btnReservarActionPerformed

    private void cmbMedicoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmbMedicoActionPerformed
        int index = cmbMedico.getSelectedIndex();
        if (index != -1) {
            usuario = (Usuario) listaMedicos.get(index);
            cambiarMedico();
        }
    }//GEN-LAST:event_cmbMedicoActionPerformed

    private void btnCancelarResActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarResActionPerformed
        int index = tblReservaciones.getSelectedRow();
        if (index != -1) {
            if (JOptionPane.showConfirmDialog(this, "¿Realmente desea cancelar la reservación de cita médica seleccionada?", "Cancelar", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == 0) {
                Reservacion r = (Reservacion) listaReservaciones.get(index);
                r.setEstado(ESTADO_CANCELADA);
                if (OperacionesBD.modificar(r)) {
                    listarReservaciones();
                    JOptionPane.showMessageDialog(null, "La reservación de cita médica ha sido cancelada correctamente ...", "Cancelar reservación", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(null, "La reservación no ha podido ser cancelada \nSi el problema persiste consulte al usuario administrador", "Cancelar reservación", JOptionPane.WARNING_MESSAGE);
                }
            }
        } else {
            JOptionPane.showMessageDialog(null, "Para cancelar la cita médica seleccionela de la lista de reservaciones", "Cancelar reservación", JOptionPane.WARNING_MESSAGE);
        }
    }//GEN-LAST:event_btnCancelarResActionPerformed

    private void cmbServicioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmbServicioActionPerformed
        int index = cmbServicio.getSelectedIndex();
        if (index != -1) {
            servicio = (Servicio) listaServicios.get(index);
            txtCosto.setText(servicio.getCosto() + "");
        } else {
            servicio = null;
            txtCosto.setText("");
        }
    }//GEN-LAST:event_cmbServicioActionPerformed

    private void btnBuscarPacienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBuscarPacienteActionPerformed
        iFrmLstPaciente ifFrmLstPaciente1 = new iFrmLstPaciente(iFrmLstPaciente.F_RESERVAR_CITA);
        frmPrincipal.dskpPrincipal.add(ifFrmLstPaciente1);
        ifFrmLstPaciente1.toFront();
        OperacionesVarias.centrar(this);
        ifFrmLstPaciente1.setVisible(true);
    }//GEN-LAST:event_btnBuscarPacienteActionPerformed

    private void tblReservacionesKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tblReservacionesKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_DELETE) {
            btnCancelarResActionPerformed(null);
        }
    }//GEN-LAST:event_tblReservacionesKeyReleased

    private void cmbFechaPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_cmbFechaPropertyChange
        Date d = cmbFecha.getDate();
        if (d != null) {
            listarReservaciones();
        }
    }//GEN-LAST:event_cmbFechaPropertyChange

    private void cmbHorarioFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cmbHorarioFocusGained
        listarHorario();
    }//GEN-LAST:event_cmbHorarioFocusGained
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnBuscarPaciente;
    private javax.swing.JButton btnCancelarRes;
    private javax.swing.JButton btnCerrar;
    private javax.swing.JButton btnReservar;
    private com.toedter.calendar.JDateChooser cmbFecha;
    private javax.swing.JComboBox cmbHorario;
    private javax.swing.JComboBox cmbMedico;
    private javax.swing.JComboBox cmbServicio;
    private javax.swing.ButtonGroup grpradBuscar;
    private javax.swing.JLabel lblApellido;
    private javax.swing.JLabel lblCedula;
    private javax.swing.JLabel lblFechaReserva;
    private javax.swing.JLabel lblHora;
    private javax.swing.JLabel lblMedico;
    private javax.swing.JLabel lblNombre;
    private javax.swing.JLabel lblReservacion;
    private javax.swing.JLabel lblServicio;
    private javax.swing.JLabel lblTiempo;
    private javax.swing.JLabel lblValor;
    private javax.swing.JLabel lblnhc;
    private javax.swing.JPanel pnlCambioEspecialista;
    private javax.swing.JPanel pnlEspecialista;
    private javax.swing.JPanel pnlFechaHora;
    private javax.swing.JPanel pnlIdentidad;
    private javax.swing.JScrollPane scrolpReserva;
    private javax.swing.JTable tblReservaciones;
    private static javax.swing.JTextField txtApellido;
    private static javax.swing.JTextField txtCedula;
    private javax.swing.JTextField txtCosto;
    private javax.swing.JTextField txtMedico;
    private static javax.swing.JTextField txtNhc;
    private static javax.swing.JTextField txtNombre;
    private javax.swing.JTextField txtTiempo;
    // End of variables declaration//GEN-END:variables
}
